﻿
//----------------------------------------------------------------------------------------
// Copyright (C) 2008  银龙小子 版权所有。
//
// 文件编号：      
// 文 件 名：      CreateTableSql.cs
// 文件功能描述：   用来创建SQL语句
//
// 创建标识：      毛才君    2008-3-22 13:01:04
//
// 修改标识：
// 修改描述：
// 
// 修改标识：
// 修改描述：
//----------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Text;

namespace MaoCaiJun.DataBase.BuildProviders.BuildClass.Sql2000
{
    class CreateTableSql
    {
        /// <summary>
        /// 创建SQL语句
        /// </summary>
        /// <returns></returns>
        public static string CreateSql(MaoCaiJun.DataBase.Configuration.DbsAnalysis.Class dbsAnalysisClass)
        {
            if (dbsAnalysisClass.ID == null)
            {
                throw new Exception("在生成表 " + dbsAnalysisClass.Table + " 时 发现没有主键");
            }
            if (dbsAnalysisClass.ID.SqlIndex == null)
            {
                dbsAnalysisClass.ID.SqlIndex = "PK_" + dbsAnalysisClass.Table;
            }
            List<MaoCaiJun.DataBase.Configuration.DbsAnalysis.Property> modelField = new List<MaoCaiJun.DataBase.Configuration.DbsAnalysis.Property>();
            modelField.Add(dbsAnalysisClass.ID);
            foreach (MaoCaiJun.DataBase.Configuration.DbsAnalysis.Property item in dbsAnalysisClass.Property)
            {
                modelField.Add(item);
            }
            const string corporation = "MaoCaiJun.DataBase 代码辅助工具  (毛才君)";
            const string author = "MaoCaiJun.DataBase 代码辅助工具  (毛才君)";
            string[] strtypes = new string[] { "binary", "char", "nchar", "nvarchar", "varbinary", "varchar", "decimal" };


            StringBuilder sql = new StringBuilder();
            sql.AppendLine("------------------------------------------------------------------------------------------");
            sql.AppendLine("-- Copyright (C) " + DateTime.Now.Year + "  " + corporation + " 版权所有。");
            sql.AppendLine("--");
            sql.AppendLine("-- 代码辅助工具：银龙3代");
            sql.AppendLine("--");
            sql.AppendLine("-- 文件编号：");
            sql.AppendLine("-- 文 件 名：");
            sql.AppendLine("-- 文件功能描述：   表 " + dbsAnalysisClass.Table + "  T-SQL 数据库存贮过程生成文件");
            sql.AppendLine("--");
            sql.AppendLine("-- 创建标识：      " + author + "    " + DateTime.Now + "");
            sql.AppendLine("--");
            sql.AppendLine("-- 修改标识：");
            sql.AppendLine("-- 修改描述：");
            sql.AppendLine("--");
            sql.AppendLine("-- 修改标识：");
            sql.AppendLine("-- 修改描述：");
            sql.AppendLine();
            #region 创建表
            sql.AppendLine("----------------------------------------------------------------------------------------");
            sql.AppendLine("--region 创建表");
            sql.AppendLine("----------------------------------------------------------------------------------------");
            sql.AppendLine("if not exists (select * from dbo.sysobjects where id = object_id(N'[" + dbsAnalysisClass.Table + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)");
            sql.AppendLine(" BEGIN");
            sql.AppendLine("CREATE TABLE [" + dbsAnalysisClass.Table + "] (");
            for (int i = 0; i < modelField.Count; i++)
            {
                sql.Append("[" + modelField[i].SqlName + "] [" + modelField[i].SqlType + "] ");
                //
                //if (ModelDBClass[i].SqlLength > 0)
                //{
                for (int ii = 0; ii < strtypes.Length; ii++)
                {
                    if (strtypes[ii] == modelField[i].SqlType)
                    {
                        sql.Append(" (" + modelField[i].SqlLength + ") ");
                    }
                }
                //}

                //
                if (modelField[i].SqlNotNull)
                {
                    sql.Append(" NOT NULL ");
                }
                else
                {
                    sql.Append(" NULL ");
                }
                //if (ModelDBClass[i].SqlValue!=string.Empty)
                //{
                //    sql.Append(" DEFAULT ('" + ModelDBClass[i].SqlValue + "') ");
                //}
                sql.AppendLine(" ,");

            }
            sql.AppendLine("    CONSTRAINT [" + dbsAnalysisClass.ID.SqlIndex + "] PRIMARY KEY  CLUSTERED ");
            sql.AppendLine("    (");
            sql.AppendLine("        [" + dbsAnalysisClass.ID.SqlName + "]");
            sql.AppendLine("    )  ON [PRIMARY] ");
            sql.AppendLine(") ON [PRIMARY]");
           
            sql.AppendLine("END");
            sql.AppendLine("GO");

            //for (int i = 0; i < modelField.Count; i++)
            //{
            //    sql.AppendLine("if exists (SELECT * FROM FN_LISTEXTENDEDPROPERTY (N'MS_Description',N'SCHEMA',N'dbo',N'TABLE',N'" + dbsAnalysisClass.Table + "',N'COLUMN',N'" + modelField[i].SqlName + "'))");
            //    sql.AppendLine("BEGIN");
            //    sql.AppendLine("EXEC sys.sp_dropextendedproperty @name=N'MS_Description', @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'" + dbsAnalysisClass.Table + "', @level2type=N'COLUMN',@level2name=N'" + modelField[i].SqlName + "'");
            //    sql.AppendLine("END");
            //    sql.AppendLine("EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'" + modelField[i].Summary + "' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'" + dbsAnalysisClass.Table + "', @level2type=N'COLUMN',@level2name=N'" + modelField[i].SqlName + "'");
            //    sql.AppendLine("GO");
            //}
           

            sql.AppendLine("--endregion");
            sql.AppendLine();
            #endregion 创建表
            #region 删除现有的存储过程
            sql.AppendLine("--region 删除现有的存储过程");
            sql.AppendLine("----------------------------------------------------------------------------------------");
            sql.Append(GenerateDropStatement(Config.DbTablePrefix + string.Format(Config.DbTableSqlDeleteByIndex, dbsAnalysisClass.Table)));
            sql.Append(GenerateDropStatement(Config.DbTablePrefix + string.Format(Config.DbTableSqlDeleteDynamic, dbsAnalysisClass.Table)));
            sql.Append(GenerateDropStatement(Config.DbTablePrefix + string.Format(Config.DbTableSqlExists, dbsAnalysisClass.Table)));
            sql.Append(GenerateDropStatement(Config.DbTablePrefix + string.Format(Config.DbTableSqlGetMaxId, dbsAnalysisClass.Table)));
            sql.Append(GenerateDropStatement(Config.DbTablePrefix + string.Format(Config.DbTableSqlInsert, dbsAnalysisClass.Table)));
            sql.Append(GenerateDropStatement(Config.DbTablePrefix + string.Format(Config.DbTableSqlInsertUpdate, dbsAnalysisClass.Table)));
            sql.Append(GenerateDropStatement(Config.DbTablePrefix + string.Format(Config.DbTableSqlSelect, dbsAnalysisClass.Table)));
            sql.Append(GenerateDropStatement(Config.DbTablePrefix + string.Format(Config.DbTableSqlSelectPagingRecord, dbsAnalysisClass.Table)));
            sql.Append(GenerateDropStatement(Config.DbTablePrefix + string.Format(Config.DbTableSqlUpdate, dbsAnalysisClass.Table)));
            sql.AppendLine("--endregion");
            sql.AppendLine();
            sql.AppendLine("GO");
            sql.AppendLine();
            sql.AppendLine("--region [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlDeleteByIndex, dbsAnalysisClass.Table) + "]");
            sql.AppendLine();
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine("-- 创建标识:  " + author + "       " + DateTime.Now + "");
            sql.AppendLine("-- 存储过程:  [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlDeleteByIndex, dbsAnalysisClass.Table) + "]");
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine();
            #endregion 删除现有的存储过程
            #region Insert
            sql.AppendLine("--region [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlInsert, dbsAnalysisClass.Table) + "]");
            sql.AppendLine();
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine("-- 创建标识:  " + author + "       " + DateTime.Now + "");
            sql.AppendLine("-- 存储过程:  [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlInsert, dbsAnalysisClass.Table) + "]");
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine();
            sql.AppendLine("CREATE PROCEDURE [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlInsert, dbsAnalysisClass.Table) + "]");
            for (int i = 0; i < modelField.Count; i++)
            {
                sql.Append("    @" + modelField[i].SqlName + " " + modelField[i].SqlType);
                //if (ModelDBClass[i].SqlLength > 0)
                //{      
                for (int ii = 0; ii < strtypes.Length; ii++)
                {
                    if (strtypes[ii] == modelField[i].SqlType)
                    {
                        sql.Append(" (" + modelField[i].SqlLength + ") ");
                    }
                }
                //}
                sql.AppendLine(",");
            }
            sql = sql.Remove(sql.Length - 3, 1);
            sql.AppendLine("AS");
            sql.AppendLine();
            sql.AppendLine("SET NOCOUNT OFF");
            sql.AppendLine();
            sql.AppendLine("INSERT INTO [" + dbsAnalysisClass.Table + "] (");
            for (int i = 0; i < modelField.Count; i++)
            {
                sql.AppendLine("    [" + modelField[i].SqlName + "],");
            }
            sql = sql.Remove(sql.Length - 3, 1);
            sql.AppendLine(") VALUES (");
            for (int i = 0; i < modelField.Count; i++)
            {
                sql.AppendLine("    @" + modelField[i].SqlName + ",");
            }
            sql = sql.Remove(sql.Length - 3, 1);

            sql.AppendLine(")");
            sql.AppendLine();
            sql.AppendLine("--endregion");
            sql.AppendLine();
            sql.AppendLine("GO");
            sql.AppendLine();
            #endregion Insert
            #region update
            sql.AppendLine("--region [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlUpdate, dbsAnalysisClass.Table) + "]");
            sql.AppendLine();
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine("-- 创建标识:  " + author + "       " + DateTime.Now + "");
            sql.AppendLine("-- 存储过程:  [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlUpdate, dbsAnalysisClass.Table) + "]");
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine();
            sql.AppendLine("CREATE PROCEDURE [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlUpdate, dbsAnalysisClass.Table) + "]");
            for (int i = 0; i < modelField.Count; i++)
            {
                sql.Append("    @" + modelField[i].SqlName + " " + modelField[i].SqlType);
                //if (ModelDBClass[i].SqlLength>0)
                //{
                for (int ii = 0; ii < strtypes.Length; ii++)
                {
                    if (strtypes[ii] == modelField[i].SqlType)
                    {
                        sql.Append(" (" + modelField[i].SqlLength + ") ");
                    }
                }
                //}
                sql.AppendLine(",");
            }
            sql = sql.Remove(sql.Length - 3, 1);
            sql.AppendLine("AS");
            sql.AppendLine("SET NOCOUNT OFF");
            sql.AppendLine("UPDATE [" + dbsAnalysisClass.Table + "] SET");
            for (int i = 0; i < modelField.Count; i++)
            {
                sql.AppendLine("    [" + modelField[i].SqlName + "]=@" + modelField[i].SqlName + ",");
            }
            sql = sql.Remove(sql.Length - 3, 1);
            sql.AppendLine("WHERE");
            sql.AppendLine("    [" + dbsAnalysisClass.ID.SqlName + "] = @" + dbsAnalysisClass.ID.SqlName + "");
            sql.AppendLine();
            sql.AppendLine("--endregion");
            sql.AppendLine();
            sql.AppendLine("GO");
            sql.AppendLine();
            #endregion update
            #region InsertUpdate
            sql.AppendLine("--region [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlInsertUpdate, dbsAnalysisClass.Table) + "]");
            sql.AppendLine();
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine("-- 创建标识:  " + author + "       " + DateTime.Now + "");
            sql.AppendLine("-- 存储过程:  [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlInsertUpdate, dbsAnalysisClass.Table) + "]");
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine();
            sql.AppendLine("CREATE PROCEDURE [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlInsertUpdate, dbsAnalysisClass.Table) + "]");
            for (int i = 0; i < modelField.Count; i++)
            {
                sql.Append("    @" + modelField[i].SqlName + " " + modelField[i].SqlType);
                //if (ModelDBClass[i].SqlLength > 0)
                //{
                for (int ii = 0; ii < strtypes.Length; ii++)
                {
                    if (strtypes[ii] == modelField[i].SqlType)
                    {
                        sql.Append(" (" + modelField[i].SqlLength + ") ");
                    }
                }
                //}
                sql.AppendLine(",");
            }
            sql = sql.Remove(sql.Length - 3, 1);
            sql.AppendLine("AS");
            sql.AppendLine("SET NOCOUNT OFF");
            sql.AppendLine("IF EXISTS(SELECT [" + dbsAnalysisClass.ID.SqlName + "] FROM [" + dbsAnalysisClass.Table + "] WHERE [" + dbsAnalysisClass.ID.SqlName + "] = @" + dbsAnalysisClass.ID.SqlName + ")");
            sql.AppendLine("BEGIN");
            sql.AppendLine("    UPDATE [" + dbsAnalysisClass.Table + "] SET");
            for (int i = 0; i < modelField.Count; i++)
            {
                sql.AppendLine("    [" + modelField[i].SqlName + "]=@" + modelField[i].SqlName + ",");
            }
            sql = sql.Remove(sql.Length - 3, 1);
            sql.AppendLine("    WHERE");
            sql.AppendLine("        [" + dbsAnalysisClass.ID.SqlName + "] = @" + dbsAnalysisClass.ID.SqlName + "");
            sql.AppendLine("END");
            sql.AppendLine("ELSE");
            sql.AppendLine("BEGIN");
            sql.AppendLine("    INSERT INTO [" + dbsAnalysisClass.Table + "] (");
            for (int i = 0; i < modelField.Count; i++)
            {
                sql.AppendLine("    [" + modelField[i].SqlName + "],");
            }
            sql = sql.Remove(sql.Length - 3, 1);
            sql.AppendLine("    ) VALUES (");
            for (int i = 0; i < modelField.Count; i++)
            {
                sql.AppendLine("    @" + modelField[i].SqlName + ",");
            } sql = sql.Remove(sql.Length - 3, 1);
            sql.AppendLine("    )");
            sql.AppendLine("END");
            sql.AppendLine();
            sql.AppendLine("--endregion");
            sql.AppendLine();
            sql.AppendLine("GO");
            sql.AppendLine();
            #endregion InsertUpdate
            #region DeleteByIndex
            sql.AppendLine("--region [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlDeleteByIndex, dbsAnalysisClass.Table) + "]");
            sql.AppendLine();
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine("-- 创建标识:  " + author + "       " + DateTime.Now + "");
            sql.AppendLine("-- 存储过程:  [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlDeleteByIndex, dbsAnalysisClass.Table) + "]");
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine();
            sql.AppendLine("CREATE PROCEDURE [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlDeleteByIndex, dbsAnalysisClass.Table) + "]");
            sql.Append("    @" + dbsAnalysisClass.ID.SqlName + " " + dbsAnalysisClass.ID.SqlType + "");
            for (int ii = 0; ii < strtypes.Length; ii++)
            {
                if (strtypes[ii] == dbsAnalysisClass.ID.SqlType)
                {
                    sql.Append(" (" + dbsAnalysisClass.ID.SqlLength + ") ");
                }
            }
            sql.AppendLine();
            sql.AppendLine("AS");
            sql.AppendLine("SET NOCOUNT OFF");
            sql.AppendLine("DELETE FROM [" + dbsAnalysisClass.Table + "]");
            sql.AppendLine("WHERE");
            sql.AppendLine("    [" + dbsAnalysisClass.ID.SqlName + "] = @" + dbsAnalysisClass.ID.SqlName + "");
            sql.AppendLine("--endregion");
            sql.AppendLine();
            sql.AppendLine("GO");
            sql.AppendLine();
            #endregion DeleteByIndex
            #region DeleteDynamic
            sql.AppendLine("--region [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlDeleteDynamic, dbsAnalysisClass.Table) + "]");
            sql.AppendLine();
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine("-- 创建标识:  " + author + "       " + DateTime.Now + "");
            sql.AppendLine("-- 存储过程:  [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlDeleteDynamic, dbsAnalysisClass.Table) + "]");
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine("CREATE PROCEDURE [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlDeleteDynamic, dbsAnalysisClass.Table) + "]");
            sql.AppendLine("    @strWhere nvarchar(1000)");
            sql.AppendLine("AS");
            sql.AppendLine();
            sql.AppendLine("SET NOCOUNT OFF");
            sql.AppendLine();
            sql.AppendLine("    DECLARE @SQL nvarchar(3250)");
            sql.AppendLine("    --处理SQL中危险字符,并且将条件处理成易嵌入的形式 ");
            sql.AppendLine("    --set @strWhere=replace(@strWhere,'''','''''') ");
            sql.AppendLine("    set @strWhere=replace(@strWhere,'--','') ");
            sql.AppendLine("    set @strWhere=replace(@strWhere,';','') ");
            sql.AppendLine();
            sql.AppendLine("    SET @SQL = '");
            sql.AppendLine("    DELETE FROM");
            sql.AppendLine("        [" + dbsAnalysisClass.Table + "] '");
            sql.AppendLine("        if(@strWhere!='')");
            sql.AppendLine("    SET @SQL = @SQL+'");
            sql.AppendLine("    WHERE");
            sql.AppendLine("        ' + @strWhere");
            sql.AppendLine();
            sql.AppendLine("    EXEC sp_executesql @SQL");
            sql.AppendLine("--endregion");
            sql.AppendLine();
            sql.AppendLine("GO");
            sql.AppendLine();
            #endregion DeleteDynamic
            #region lt_Select
            sql.AppendLine("--region [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlSelect, dbsAnalysisClass.Table) + "]");
            sql.AppendLine();
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine("-- 创建标识:  " + author + "       " + DateTime.Now + "");
            sql.AppendLine("-- 存储过程:  [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlSelect, dbsAnalysisClass.Table) + "]");
            sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            sql.AppendLine();
            sql.AppendLine("CREATE PROCEDURE [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlSelect, dbsAnalysisClass.Table) + "]");
            sql.Append("    @" + dbsAnalysisClass.ID.SqlName + " " + dbsAnalysisClass.ID.SqlType);
            for (int ii = 0; ii < strtypes.Length; ii++)
            {
                if (strtypes[ii] == dbsAnalysisClass.ID.SqlType)
                {
                    sql.Append(" (" + dbsAnalysisClass.ID.SqlLength + ") ");
                }
            }
            sql.AppendLine(" --条件 ");
            sql.AppendLine("AS");
            sql.AppendLine();
            sql.AppendLine("SET NOCOUNT ON");
            sql.AppendLine("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
            sql.AppendLine();
            sql.AppendLine("SELECT");
            for (int i = 0; i < modelField.Count; i++)
            {
                sql.AppendLine("    [" + modelField[i].SqlName + "],");
            }
            sql = sql.Remove(sql.Length - 3, 1);
            sql.AppendLine("FROM");
            sql.AppendLine("    [" + dbsAnalysisClass.Table + "]");
            sql.AppendLine("WHERE");
            sql.AppendLine("    [" + dbsAnalysisClass.ID.SqlName + "] = @" + dbsAnalysisClass.ID.SqlName + "");//--------
            sql.AppendLine();
            sql.AppendLine("--endregion");
            sql.AppendLine();
            sql.AppendLine("GO");
            sql.AppendLine();
            #endregion lt_Select
            #region lt_Exists
            //sql.AppendLine("--region [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlExists, dbsAnalysisClass.Table) + "]");
            //sql.AppendLine();
            //sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            //sql.AppendLine("-- 创建标识:  " + Author + "       " + System.DateTime.Now.ToString() + "");
            //sql.AppendLine("-- 存储过程:  [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlExists, dbsAnalysisClass.Table) + "]");
            //sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
            //sql.AppendLine();
            //sql.AppendLine("CREATE PROCEDURE [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlExists, dbsAnalysisClass.Table) + "]");
            //sql.AppendLine("    @tablename varchar(100),		--表名或视图表 ");
            //sql.AppendLine("    @field varchar(100),			--字段");
            //sql.AppendLine("    @value varchar(100)					--值");
            //sql.AppendLine("AS");
            //sql.AppendLine("    DECLARE @r int;");
            //sql.AppendLine("    DECLARE @SQL nvarchar(3250)");
            //sql.AppendLine("    SET @SQL = 'DECLARE @TempID int;';");
            //sql.AppendLine("    SET @SQL = @SQL+'SELECT @TempID = count(1) FROM '+@tablename+' WHERE ['+@field+'] = '+@value+';'");
            //sql.AppendLine("    SET @SQL = @SQL+'IF @TempID = 0 set @r=0;'");
            //sql.AppendLine("    SET @SQL = @SQL+'ELSE set @r= 1;'");
            //sql.AppendLine();
            //sql.AppendLine("    EXEC sp_executesql @SQL, N'@r INT output', @r output");
            //sql.AppendLine("    --print @r");
            //sql.AppendLine("    return @r");
            //sql.AppendLine("--endregion");
            //sql.AppendLine();
            //sql.AppendLine("GO");
            //sql.AppendLine();
            #endregion lt_Exists
            #region lt_GetMaxId
            if (dbsAnalysisClass.ID.SqlType == "int")
            {
                sql.AppendLine("--region [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlGetMaxId, dbsAnalysisClass.Table) + "]");
                sql.AppendLine();
                sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
                sql.AppendLine("-- 创建标识:  " + author + "       " + DateTime.Now + "");
                sql.AppendLine("-- 存储过程:  [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlGetMaxId, dbsAnalysisClass.Table) + "]");
                sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
                sql.AppendLine();
                sql.AppendLine("CREATE PROCEDURE [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlGetMaxId, dbsAnalysisClass.Table) + "]");
                sql.AppendLine("    @tablename varchar(100),		--表名或视图表 ");
                sql.AppendLine("    @keyfield varchar(100),			--主键");
                sql.AppendLine("    @ReturnValue int=0 output 		--返回最大记录值");
                sql.AppendLine("AS");
                sql.AppendLine("    DECLARE @r int;");
                sql.AppendLine("    DECLARE @SQL nvarchar(3250)");
                sql.AppendLine("    SET @SQL = 'DECLARE @TempID int;';");
                sql.AppendLine("    SET @SQL = @SQL+'SELECT @TempID = max(CAST(['+@keyfield+'] as int))+1 FROM '+@tablename+';'");
                sql.AppendLine("    SET @SQL = @SQL+'IF @TempID IS NULL set @r=1;'");
                sql.AppendLine("    SET @SQL = @SQL+'ELSE set @r= @TempID;'");
                sql.AppendLine();
                sql.AppendLine("    EXEC sp_executesql @SQL, N'@r INT output', @r output");
                sql.AppendLine("    --print @r");
                sql.AppendLine("    set @ReturnValue=@r");
                sql.AppendLine("    return @r");
                sql.AppendLine("--endregion");
                sql.AppendLine();
                sql.AppendLine("GO");
                sql.AppendLine();
            }
            #endregion lt_GetMaxId
            //lt_SelectPagingRecord
            sql.AppendLine("--region [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlSelectPagingRecord, dbsAnalysisClass.Table) + "]");
            sql.AppendLine();
            if (dbsAnalysisClass.Type == MaoCaiJun.DataBase.Sys.Data.SqlType.Sql2000)
            {
                sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
                sql.AppendLine("-- 创建标识:  " + author + "       " + DateTime.Now + "");
                sql.AppendLine("-- 存储过程:  [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlSelectPagingRecord, dbsAnalysisClass.Table) + "]");
                sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
                sql.AppendLine();
                sql.AppendLine("CREATE PROCEDURE [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlSelectPagingRecord, dbsAnalysisClass.Table) + "]");
                sql.AppendLine("    @PageSize int=10 ,							--每页显示的记录数");
                sql.AppendLine("    @PageIndex int=1 ,							--当前要显示的页号");
                sql.AppendLine("    @keyfield varchar(100)='' ,					--主键名或者标识列名");
                sql.AppendLine("    @fieldlist varchar(4000)='*', 				--select子句，不包含select关键字,如：*或者Id,UserId,UserName等。");
                sql.AppendLine("    @tablename varchar(1000)='', 				--from子句，不包含from关键子，如：myTable或者myTable,yourTable");
                sql.AppendLine("    @strwhere varchar(4000)='', 				--Where子句，不包含where关键字，如空的，或者 id>2 等");
                sql.AppendLine("    @orderfield varchar(4000)='',				--order by 子句，不包含order by 子句 ，如id desc,UserId asc 等");
                sql.AppendLine("    @IsReCount bit = 0,           				-- 返回记录总数, 非 0 值则返回记录总数");
                sql.AppendLine("    @CountRows int=0 output, 					--返回记录总数");
                sql.AppendLine("    @CountPage int=0 output 					--返回总页数");
                sql.AppendLine("as");
                sql.AppendLine("--------处理SQL中危险字符,并且将条件处理成易嵌入的形式 ");
                sql.AppendLine("    --set @strwhere=replace(@strwhere,'''','''''') ");
                sql.AppendLine("    set @strwhere=replace(@strwhere,'--','') ");
                sql.AppendLine("    set @strwhere=replace(@strwhere,';','') ");
                sql.AppendLine("--------定义局部变量-----------------");
                sql.AppendLine("    declare @Id1 varchar(20),@Id2 varchar(20) 	--开始和结束的记录号");
                sql.AppendLine("    declare @OrderBySqls varchar(1000) 			--order by 子句");
                sql.AppendLine("    declare @WhereSqls varchar(2000) 			--where 子句");
                sql.AppendLine("    declare @Sqls nvarchar(4000) 				--最终组合成的Sqls语句");
                sql.AppendLine("    declare @TmpStr varchar(2000) 				--临时");
                sql.AppendLine("--------order by--------------------");
                sql.AppendLine("    if @orderfield <> ''");
                sql.AppendLine("        set @OrderBySqls = ' order by '+@orderfield");
                sql.AppendLine("    else");
                sql.AppendLine("        set @OrderBySqls = ''");
                sql.AppendLine("--------where ----------------------");
                sql.AppendLine("    if @strwhere <> ''");
                sql.AppendLine("        set @WhereSqls = ' where ('+@strwhere+')'");
                sql.AppendLine("    else");
                sql.AppendLine("        set @WhereSqls = ''");
                sql.AppendLine("--------");
                sql.AppendLine("    set @TmpStr = @WhereSqls");
                sql.AppendLine("    if @IsReCount != 0");
                sql.AppendLine("        goto LabelRes");
                sql.AppendLine("--------如果显示第一页，可以直接用top来完成");
                sql.AppendLine("    if @PageIndex<=1");
                sql.AppendLine("    begin");
                sql.AppendLine("        select @Id1=cast(@PageSize as varchar(20))");
                sql.AppendLine("        if @PageSize=0");
                sql.AppendLine("            set @Sqls =  ('select '+@fieldlist+' from '+@tablename+' '+@WhereSqls+@OrderBySqls)");
                sql.AppendLine("        else");
                sql.AppendLine("            set @Sqls =  ('select top '+@Id1+' '+@fieldlist+' from '+@tablename+' '+@WhereSqls+@OrderBySqls)");
                sql.AppendLine("        exec sp_executesql @Sqls"); 
                sql.AppendLine("        --print('select top '+@Id1+' '+@fieldlist+' from '+@tablename+' '+@WhereSqls+@OrderBySqls)");
                sql.AppendLine("        goto LabelRes");
                sql.AppendLine("    end");
                sql.AppendLine("----------");
                sql.AppendLine("    select @Id1=cast(@PageSize as varchar(20)),@Id2=cast((@PageIndex-1)*@PageSize as varchar(20))");
                sql.AppendLine("----------");
                sql.AppendLine("    if @WhereSqls <> ''");
                sql.AppendLine("        set @WhereSqls = @WhereSqls + ' and (' + @keyfield+' not in(select top '+@Id2+' '+@keyfield+' from '+@tablename+' '+@WhereSqls+@OrderBySqls+'))'");
                sql.AppendLine("    else");
                sql.AppendLine("        set @WhereSqls = ' where ' + @keyfield+' not in(select top '+@Id2+' '+@keyfield+' from '+@tablename+' '+@WhereSqls+@OrderBySqls+')'");
                sql.AppendLine("----------");
                sql.AppendLine("    if @PageSize=0");
                sql.AppendLine("        set @Sqls = 'select '+ @fieldlist+' from '+@tablename+''+@WhereSqls+@OrderBySqls");
                sql.AppendLine("    else");
                sql.AppendLine("        set @Sqls = 'select top '+@Id1+ ' '+ @fieldlist+' from '+@tablename+''+@WhereSqls+@OrderBySqls");
                sql.AppendLine("    exec sp_executesql @Sqls");
                sql.AppendLine("    --print @Sqls");
                sql.AppendLine("-----------");
                sql.AppendLine("    LabelRes:");
                sql.AppendLine("--------返回总记录数");
                sql.AppendLine("    set @Sqls = 'select @a=count(1) from '+@tablename+' '+@TmpStr");
                sql.AppendLine("    exec sp_executesql @sqls,N'@a int output',@CountRows output");
                sql.AppendLine("--------返回总页数");
                sql.AppendLine("    if @CountRows <= @PageSize");
                sql.AppendLine("        set @CountPage = 1");
                sql.AppendLine("    else if @PageSize=0");
                sql.AppendLine("        set @CountPage=0");
                sql.AppendLine("    else");
                sql.AppendLine("    begin");
                sql.AppendLine("        set @CountPage = @CountRows/@PageSize");
                sql.AppendLine("        if (@CountRows%@PageSize) > 0");
                sql.AppendLine("            set @CountPage = @CountPage + 1");
                sql.AppendLine("    end");
                sql.AppendLine("    return");
                sql.AppendLine("--endregion");
                sql.AppendLine();
                sql.AppendLine("GO");
            }
            else if (dbsAnalysisClass.Type == MaoCaiJun.DataBase.Sys.Data.SqlType.Sql2005 || dbsAnalysisClass.Type ==MaoCaiJun.DataBase.Sys.Data.SqlType.Sql2008 )
            {
                sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
                sql.AppendLine("-- 创建标识:  " + author + "       " + DateTime.Now + "");
                sql.AppendLine("-- 存储过程:  [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlSelectPagingRecord, dbsAnalysisClass.Table) + "]");
                sql.AppendLine("------------------------------------------------------------------------------------------------------------------------");
                sql.AppendLine();
                sql.AppendLine("CREATE PROCEDURE [" + Config.DbTablePrefix + string.Format(Config.DbTableSqlSelectPagingRecord, dbsAnalysisClass.Table) + "]");
                sql.AppendLine("    @PageSize int=10 ,							--每页显示的记录数");
                sql.AppendLine("    @PageIndex int=1 ,							--当前要显示的页号");
                sql.AppendLine("    @keyfield varchar(100)='' ,					--主键名或者标识列名");
                sql.AppendLine("    @fieldlist varchar(MAX)='*', 				--select子句，不包含select关键字,如：*或者Id,UserId,UserName等。");
                sql.AppendLine("    @tablename varchar(MAX)='', 				--from子句，不包含from关键子，如：myTable或者myTable,yourTable");
                sql.AppendLine("    @strwhere varchar(MAX)='', 				--Where子句，不包含where关键字，如空的，或者 id>2 等");
                sql.AppendLine("    @orderfield varchar(MAX)='',				--order by 子句，不包含order by 子句 ，如id desc,UserId asc 等");
                sql.AppendLine("    @IsReCount bit = 0,           				-- 返回记录总数, 非 0 值则返回记录总数");
                sql.AppendLine("    @CountRows int=0 output, 					--返回记录总数");
                sql.AppendLine("    @CountPage int=0 output 					--返回总页数");
                sql.AppendLine("as");
                sql.AppendLine("--------处理SQL中危险字符,并且将条件处理成易嵌入的形式 ");
                sql.AppendLine("    --set @strwhere=replace(@strwhere,'''','''''') ");
                sql.AppendLine("    set @strwhere=replace(@strwhere,'--','') ");
                sql.AppendLine("    set @strwhere=replace(@strwhere,';','') ");
                sql.AppendLine("    --  if @PageIndex=0; ");
                sql.AppendLine("    --set @PageIndex=1; ");
                sql.AppendLine("--------定义局部变量-----------------");
                sql.AppendLine("    declare @Id1 varchar(20),@Id2 varchar(20) 	--开始和结束的记录号");
                sql.AppendLine("    declare @OrderBySqls varchar(MAX) 			--order by 子句");
                sql.AppendLine("    declare @WhereSqls varchar(MAX) 			--where 子句");
                sql.AppendLine("    declare @Sqls nvarchar(MAX) 				--最终组合成的Sqls语句");
                sql.AppendLine("    declare @TmpStr varchar(MAX) 				--临时");
                sql.AppendLine("    declare @Portion  nvarchar(MAX)");
                sql.AppendLine("--------order by--------------------");
                sql.AppendLine("    if @orderfield <> ''");
                sql.AppendLine("        set @OrderBySqls = ' order by '+@orderfield");
                sql.AppendLine("    else");
                sql.AppendLine("        set @OrderBySqls = ''");
                sql.AppendLine("--------where ----------------------");
                sql.AppendLine("    if @strwhere <> ''");
                sql.AppendLine("        set @WhereSqls = ' where ('+@strwhere+')'");
                sql.AppendLine("    else");
                sql.AppendLine("        set @WhereSqls = ''");
                sql.AppendLine("--------");
                sql.AppendLine("    set @TmpStr = @WhereSqls");
                sql.AppendLine("    if @IsReCount != 0");
                sql.AppendLine("        goto LabelRes");
                sql.AppendLine("--------如果显示第一页，可以直接用top来完成");
                sql.AppendLine("    if @PageIndex<=1");
                sql.AppendLine("    begin");
                sql.AppendLine("        select @Id1=cast(@PageSize as varchar(20))");
                sql.AppendLine("        if @PageSize=0");
                sql.AppendLine("            set @Sqls = ('select '+@fieldlist+' from '+@tablename+''+@WhereSqls+@OrderBySqls)");
                sql.AppendLine("        else");
                sql.AppendLine("            set @Sqls = ('select top '+@Id1+' '+@fieldlist+' from '+@tablename+''+@WhereSqls+@OrderBySqls)");
                sql.AppendLine("        exec sp_executesql @Sqls");
                sql.AppendLine("        --print('select top '+@Id1+' '+@fieldlist+' from '+@tablename+''+@WhereSqls+@OrderBySqls)");
                sql.AppendLine("        goto LabelRes");
                sql.AppendLine("    end");
                sql.AppendLine("--------不是第一页");
                sql.AppendLine("	--print ((@PageIndex-1)*@PageSize)+1");
                sql.AppendLine("	if (@orderfield='' or @orderfield=NULL)");
                sql.AppendLine("		set @orderfield=@keyfield");
                sql.AppendLine("    set @Sqls = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @fieldlist + ' from ' + @TableName + @WhereSqls ");
                sql.AppendLine("    set @Sqls = @Sqls + ') as t where rowId between ' + Convert(varchar(50),((@PageIndex-1)*@PageSize)+1) + ' and ' +  Convert(varchar(50),@PageIndex*@PageSize)");
                sql.AppendLine("    exec sp_executesql @Sqls");
                sql.AppendLine("--print @Sqls");
                sql.AppendLine("-----------");
                sql.AppendLine("    LabelRes:");
                sql.AppendLine("--------返回总记录数");
                sql.AppendLine("    set @Sqls = 'select @a=count(1) from '+@tablename+''+@TmpStr");
                sql.AppendLine("    exec sp_executesql @sqls,N'@a int output',@CountRows output");
                sql.AppendLine("--------返回总页数");
                sql.AppendLine("    if @CountRows <= @PageSize");
                sql.AppendLine("        set @CountPage = 1");
                sql.AppendLine("    else if @PageSize=0");
                sql.AppendLine("        set @CountPage=0");
                sql.AppendLine("    else");
                sql.AppendLine("    begin");
                sql.AppendLine("        set @CountPage = @CountRows/@PageSize");
                sql.AppendLine("        if (@CountRows%@PageSize) > 0");
                sql.AppendLine("            set @CountPage = @CountPage + 1");
                sql.AppendLine("    end");
                sql.AppendLine("    return");
                sql.AppendLine("--endregion");
                sql.AppendLine();
                sql.AppendLine("GO");
            }
            return sql.Replace("\"", "\"\"").ToString();
        }

        /// <summary>
        /// 删除现有的存储过程
        /// </summary>
        /// <param name="procedureName">存储过程名</param>
        /// <returns></returns>
        private static string GenerateDropStatement(string procedureName)
        {
            StringBuilder str = new StringBuilder();

            str.AppendLine(string.Format("IF OBJECT_ID(N'{0}') IS NOT NULL", procedureName));
            str.AppendLine(string.Format("	DROP PROCEDURE {0}", procedureName));
            str.AppendLine();

            return str.ToString();
        }
    }
}